﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ShopNet.Model;

namespace ShopNet
{
    public partial class Cesta : System.Web.UI.Page
    {
        #region Propriedades
        public new Shop Master
        {
            get
            {
                return ((Shop)(base.Master));
            }
        }

        protected IList<ProdutoCarrinho> Lista
        {
            get
            {
                if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());
                return (IList<ProdutoCarrinho>)Session["cesta"];
            }
            set { if (value != null) Session.Add("cesta", value); }
        }

        #endregion

        #region Metodos

        #region CarregarCesta

        private void CarregarCesta()
        {
            if (Lista.Count()==0)
                Master.ExibirMensagem(Shop.TipoMensagem.Warning, "Não existem Itens no carrinho!");

            gvCesta.DataSource = Lista;
            gvCesta.DataBind();

            if (gvCesta.Rows.Count>0)
            {
                //This replaces <td> with <th> and adds the scope attribute
                gvCesta.UseAccessibleHeader = true;

                //This will add the <thead> and <tbody> elements
                gvCesta.HeaderRow.TableSection = TableRowSection.TableHeader;

                //This adds the <tfoot> element. 
                //Remove if you don't have a footer row
                gvCesta.FooterRow.TableSection = TableRowSection.TableFooter;
            }
        }

        #endregion

        #region AtualizarCarrinho

        private bool AtualizarCarrinho()
        {
            foreach (GridViewRow item in gvCesta.Rows)
            {
                if (item.RowType == DataControlRowType.DataRow)
                {
                    TextBox tbQtde = (TextBox)item.FindControl("tbQtde");
                    ProdutoCarrinho pc = Lista[item.DataItemIndex];
                    int qtde = int.Parse(tbQtde.Text);

                    if (qtde > 0)
                    {
                        Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto == pc.IdProduto);
                        if (prod.QtdeEstoque < qtde || !prod.IsDisponivel)
                        {
                            Master.ExibirMensagem(Shop.TipoMensagem.Error, string.Format("Produto {0} não disponível na quantidade desejada.", prod.Nome));
                            return false;
                        }
                        pc.QtdeProduto = qtde;
                        pc.Valor = prod.precoDesconto * qtde;
                    }
                }
            }
            Lista = Lista.Where(p => p.QtdeProduto > 0).ToList();
            CarregarCesta();
            return true;
        }

        #endregion

        #endregion
        
        #region Eventos

        #region Page_Load

        protected void Page_Load(object sender, EventArgs e)
        {
            Master.ExibirMensagem(Shop.TipoMensagem.Success, string.Empty);
            if (!IsPostBack)
            {
                CarregarCesta();
            }
        }

        

        #endregion

        #region gvCesta_RowDataBound

        protected void gvCesta_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType != DataControlRowType.DataRow) return;
           
            
            ProdutoCarrinho pc = Lista[e.Row.DataItemIndex];
            Produto prod = NServico.Db.Produtos.FirstOrDefault(p => p.IdProduto == pc.IdProduto);
            HyperLink hlProduto = (HyperLink) e.Row.FindControl("hlProduto");
            hlProduto.Text = prod.Nome;
            hlProduto.NavigateUrl = string.Format("~/VisualizarProduto.aspx?idProduto={0}", pc.IdProduto);

            Label lPrecoUnitario = (Label) e.Row.FindControl("lPrecoUnitario");
            lPrecoUnitario.Text = string.Format("R$ {0}", prod.precoDesconto.ToString("#,##0.00"));

            Label lTotalCarrinho = (Label) e.Row.FindControl("lTotalCarrinho");
            lTotalCarrinho.Text = string.Format("R$ {0}", pc.Valor.ToString("#,##0.00"));

        }

        #endregion

        #region bContCompra_Click

        protected void bContCompra_Click(object sender, EventArgs e)
        {
            Response.Redirect("Default.aspx",true);
        }

        #endregion

        #region bAtualizarCarrinho_Click

        protected void bAtualizarCarrinho_Click(object sender, EventArgs e)
        {
            AtualizarCarrinho();

        }

        
        #endregion

        #region gvCesta_RowCommand

        protected void gvCesta_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            
            ProdutoCarrinho pc = Lista.FirstOrDefault(p => p.IdProduto == int.Parse(e.CommandArgument.ToString()));
            Lista.Remove(pc);
            CarregarCesta();
        }

        #endregion

        #region bFinalizar_Click

        protected void bFinalizar_Click(object sender, EventArgs e)
        {
            if (!AtualizarCarrinho())
            {
                return;
            }

            if (Lista.Count > 0)
            {
                //var prod = NServico.Db.Produtos.Where(p => Lista.Select(l => l.IdProduto).Contains(p.IdProduto)).Where(p=>p.IsDisponivel);
                //if (prod.Count()>0)
                //{
                //    Master.ExibirMensagem(Shop.TipoMensagem.Error, "Existem produtos indisponíveis na cesta.");
                //    return;
                //}

                Response.Redirect("~/Checkout/CheckoutVerifier.aspx", true);
            }
            else
                Master.ExibirMensagem(Shop.TipoMensagem.Info, "Não Existem produtos na Cesta!");
        }

        #endregion

        #endregion

        

    }
}